package com.hqhy.like.stock.service.impl;

import com.hqhy.like.common.enumerator.ServiceCode;
import com.hqhy.like.common.ex.ServiceException;
import com.hqhy.like.common.pojo.vo.PageData;
import com.hqhy.like.stock.dao.persist.repository.IStockInRepository;
import com.hqhy.like.stock.pojo.entity.StockIn;
import com.hqhy.like.stock.pojo.param.StockInAddParam;
import com.hqhy.like.stock.pojo.param.StockSearchParam;
import com.hqhy.like.stock.pojo.param.StockInUpdateParam;
import com.hqhy.like.stock.pojo.vo.StockInListItemVO;
import com.hqhy.like.stock.service.IStockInService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

@Slf4j
@Service
public class StockInServiceImpl implements IStockInService {

    @Value("${like.dao.default-query-page-size}")
    private Integer defaultQueryPageSize;
    @Autowired
    private IStockInRepository stockInRepository;

    @Override
    public int insert(StockInAddParam stockInAddParam) {
        log.debug("开始处理【新增入库】的业务，参数：{}", stockInAddParam);

        StockIn stockIn = new StockIn();
        BeanUtils.copyProperties(stockInAddParam, stockIn);
        BigDecimal number = new BigDecimal(stockIn.getNumber());
        BigDecimal price = number.multiply(stockIn.getPrice());
        stockIn.setName(stockInAddParam.getName().trim());
        stockIn.setUnit(stockInAddParam.getUnit().trim());
        //转换日期格式
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        stockIn.setStockInDate(LocalDate.parse(stockInAddParam.getStockInDate(), pattern).atStartOfDay());
        stockIn.setSubtotalPrice(price);
        int row = stockInRepository.insert(stockIn);
        if (row != 1) {
            String message = "新增入库订单失败，服务器忙，请稍后再尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_INSERT, message);
        }
//        功能太过复杂,直接放弃
//        //同时向总库存添加数据
//        String name = stockIn.getName();
//        String unit = stockIn.getUnit();
//        TotalUpdateDTO totalUpdateDTO = totalRepository.selectTotalByNameAndUnit(name, unit);
//        Total total = new Total();
//        BeanUtils.copyProperties(stockIn, total);
//        total.setNotes("");
//        log.debug("即将向总库存添加数据,totalUpdateDTO: {},参数total: {}",totalUpdateDTO,total);
//        //如果总库存有就更新,没有就新增
//        if (totalUpdateDTO != null) {
//            total.setId(totalUpdateDTO.getId());
//            Integer i = totalUpdateDTO.getNumber() + total.getNumber();
//            total.setNumber(i);
//            log.debug("更新总库存后,新的数量为:{}",i);
//            int rows = totalRepository.updateById(total);
//            if (rows !=1){
//                String message = "修改总库存对应数量失败，服务器忙，请稍后再尝试！";
//                log.warn(message);
//                throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
//            }
//        } else {
//            totalRepository.insert(total);
//        }
//        log.debug("【新增入库订单】的业务即将处理完毕，参数：{}", stockIn);
        return row;
    }

    @Override
    public int deleteById(Long id) {
        log.debug("开始处理【根据ID删除入库订单】的业务，参数：{}", id);
        //先查出删除的入库订单,和对应的总库存数据
//        StockInListItemVO stockIn = stockInRepository.selectStockInById(id);
//        if (stockIn==null){
//            String message = "删除入库订单失败，数据不存在！";
//            log.warn(message);
//            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
//        }
//
//        String name = stockIn.getName();
//        String unit = stockIn.getUnit();
//        TotalUpdateDTO totalUpdateDTO = totalRepository.selectTotalByNameAndUnit(name, unit);
//        if (totalUpdateDTO==null){
//            String message = "总库存不存在对应库存!，服务器忙，请稍后再尝试！";
//            log.warn(message);
//            throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
//        }
//        if (totalUpdateDTO.getNumber()>stockIn.getNumber()){
//            Integer number = totalUpdateDTO.getNumber() - stockIn.getNumber();
//            int rows = totalRepository.updateByNameAndUnit(name, unit, number);
//            if (rows !=1){
//                String message = "修改总库存对应数量失败，服务器忙，请稍后再尝试！";
//                log.warn(message);
//                throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
//            }
//        }else {
//            int rows = totalRepository.deleteByNameAndUnit(name, unit);
//            if (rows !=1){
//                String message = "删除总库存对应数据失败，服务器忙，请稍后再尝试！";
//                log.warn(message);
//                throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
//            }
//        }
        int rows = stockInRepository.deleteById(id);
        if (rows != 1) {
            String message = "删除入库数据失败，服务器忙，请稍后再尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_DELETE, message);
        }
        return rows;
    }

    @Override
    public int updateById(StockInUpdateParam stockInUpdateParam) {
        log.debug("开始处理【根据ID更新入库订单】的业务，参数：{}", stockInUpdateParam);

        StockIn stockIn = new StockIn();
        BeanUtils.copyProperties(stockInUpdateParam, stockIn);

        //计算总价
        BigDecimal number = new BigDecimal(stockIn.getNumber());
        BigDecimal price = number.multiply(stockIn.getPrice());
        stockIn.setSubtotalPrice(price);

        //转换日期格式
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        stockIn.setStockInDate(LocalDate.parse(stockInUpdateParam.getStockInDate(), pattern).atStartOfDay());

        //完全更新总库存太复杂,这个功能直接砍掉
//        //先根据传入的数据查询该条记录原本的情况
//        StockInListItemVO origin = stockInRepository.selectStockInById(stockInUpdateParam.getId());
//        //如果入库日期发生更改就改入库日期
//        if (stockInUpdateParam.getNumber()!=null){
//            BeanUtils.copyProperties(stockInUpdateParam, stockIn);
//            BigDecimal number = new BigDecimal(stockIn.getNumber());
//            BigDecimal price = number.multiply(stockIn.getPrice());
//            stockIn.setSubtotalPrice(price);
//        }
//        //同时向总库存添加数据,在前端进行参数校验不允许空数据进来
//        String name = stockInAddParam.getName();
//        String unit = stockInAddParam.getUnit();
//        TotalUpdateDTO totalUpdateDTO = totalRepository.selectTotalByNameAndUnit(name, unit);
//        Total total = new Total();
//        BeanUtils.copyProperties(stockIn, total);
//        total.setNotes("");
//        log.debug("即将向总库存添加数据,参数: {}",total);
//
//        //如果总库存有就更新,没有就新增
//        if (totalUpdateDTO != null) {
//            Integer i = totalUpdateDTO.getNumber() + total.getNumber();
//            total.setNumber(i);
//            totalRepository.updateById(total);
//        } else {
//            totalRepository.insert(total);
//        }

        int rows = stockInRepository.updateById(stockIn);
        if (rows != 1) {
            String message = "修改入库数据失败，服务器忙，请稍后再尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
        }
        return rows;
    }

    @Override
    public PageData<StockInListItemVO> list(Integer pageNum, Integer size) {
        log.debug("开始处理查询入库情况列表的业务, 页码: {},每页显示: {}", pageNum, size);
        Integer pageSize = size == null ? defaultQueryPageSize : size;
        return stockInRepository.list(pageNum, pageSize);
    }

    @Override
    public PageData<StockInListItemVO> listForSearch(StockSearchParam stockInSearchParam) {
        stockInSearchParam.setPageNum(stockInSearchParam.getPageNum() == null ? 1 : stockInSearchParam.getPageNum());
        stockInSearchParam.setPageSize(stockInSearchParam.getPageSize() == null ? defaultQueryPageSize : stockInSearchParam.getPageSize());
        log.debug("开始处理查询入库情况列表的业务,参数: {}", stockInSearchParam);
        return stockInRepository.listForSearch(stockInSearchParam);
    }

    @Override
    public List<StockInListItemVO> listForExport(List<Long> ids) {
        log.debug("开始处理导出入库情况列表的业务,参数: {}", ids);
        return stockInRepository.listStockInByIds(ids);
    }

    @Override
    public StockInListItemVO getStockInById(Long id) {
        log.debug("开始处理【根据ID查询入库情况】业务，参数：{}", id);
        StockInListItemVO stockInListItemVO = stockInRepository.getStockInById(id);
        if (stockInListItemVO == null) {
            String message = "获取入库情况失败，尝试访问的用户数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return stockInListItemVO;
    }

}
